package com.wang.tool.monitor.weaver;

import com.wang.tool.monitor.MonitorConfigCenter;
import com.wang.tool.monitor.core.MonitorInfo;

/**
 * 类型编织扩展
 * 返回该类型结果时执行此扩展
 * 有时我们想快速给一类接口进行统一的逻辑处理,而这些类似的实现呢大部分是拥有同类型的结果
 * 现在我们可以基于方法执行结果进行定制,注册使用,全节点共享
 * @see TypeWeaverFactory
 * @see MonitorConfigCenter
 * @author shaopeng
 * @date 2023/3/10
 */
public interface TypeWeaver<T> {

    /**
     * 适配哪个类型的结果
     * @return 非空
     */
    Class<T> point();


    /**
     * 业务执行完毕后执行
     * result 非空
     * 可以运行通用逻辑,可以是特征补充，不建议执行业务逻辑
     * 注意性能
     * 例如:对于下游采用Result对象结果,我们可以把errorCode作为status
     * @param monitorInfo 非空
     * @see MonitorInfo#stepOutMonitor
     * @see MonitorInfo#markImplicitError
     * @see MonitorInfo#setStatus
     * @see throws 异常会吞掉
     */
    void weaver(MonitorInfo<T> monitorInfo) throws Throwable;

}
